# _*_ coding: UTF-8 _*_
# @Time     : 2021/11/2 16:18
# @Author   : Gong Yangyi
# @Site     : http://www.hzdledu.cn/
# @File     : w3时.py
# @Software : PyCharm

from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait  # 等待类
from selenium.webdriver.support import expected_conditions  # 等待条件
from selenium.webdriver.common.by import By  # 定位符


# 等待机制
# 为了同步页面加载和自动化操作，需要在操作动作之前
# 打开页面之后，页面刷新，菜单弹出

# 等待机制有3种：
# 1.强制等待
# 2.隐式等待
# 3.显示等待
#可以混合使用三种等待方式:1和3 1和2 不能2和3

# 1.等地机制
# time.sleep(时间)强制线程休眠一段时间
# 等待时间不可调整的，一般用于演示以及调试
def foo1():
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('http://news.baidu.com/')
    time.sleep(1)  # 强制等待1秒
    driver.quit()


# 隐式等待
# 等待也免得的所有元素加载完成，不会等待页面部分刷新以及菜单弹出
# 只能设置一次，在driver生命周期都有效，等待时间是弹性的,是最大的等待时间
def foo2():
    driver = webdriver.Chrome()
    # 设置隐式等待
    # implicitly_wait（send）：
    driver.implicitly_wait(30)

    driver.maximize_window()

    driver.get('https://www.jd.hk/')
    driver.find_element_by_xpath('//*[@id="key"]').send_keys("衣服")
    driver.find_element_by_xpath('//*[@class="form"]/button').click()
    driver.find_element_by_xpath('//div[@class="f-sort"]/a[2]').click()

    for i in range(1, 6):
        driver.find_element_by_xpath(f'//ul[@class="gl-warp clearfix"]/li[{i}]/div[2]/div[1]/div[4]/a').click()

    driver.quit()


# 3.显示等待
#设置一个最大等待时间，每0.5秒检查一次等待条件是否成立
#在具体操作之前添加响应的等待语句
def foo3():
    driver = webdriver.Chrome()
    driver.maximize_window()
    #生成等待类的对象，设置最大等待时间
    wait=WebDriverWait(driver,30)

    driver.get('https://www.jd.com/')

    wait.until(expected_conditions.presence_of_element_located((By.ID,'key')))
    driver.find_element(By.ID,'key').send_keys("衣服")

    driver.find_element_by_xpath('//*[@class="form"]/button').click()
    driver.find_element_by_xpath('//div[@class="f-sort"]/a[2]').click()

    for i in range(1, 6):
        driver.find_element_by_xpath(f'//ul[@class="gl-warp clearfix"]/li[{i}]/div[2]/div[1]/div[4]/a').click()

    driver.quit()


if __name__ == '__main__':
    # foo1()
    foo2()
